Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

71
Visualizações
Javascript convierte varios eventos táctiles en un solo "clic".

Tengo una pantalla táctil, si no obtiene el tiempo de presión del botón exactamente en Chrome, que es aproximadamente el 50% del tiempo para todos, el click() no se registra. Si presiona un botón durante demasiado tiempo, simplemente lo enfoca (sin disparar un evento de enfoque). Si presiona un botón demasiado rápido, lo ignora como un error. Así que actualmente la pantalla táctil es muy difícil de usar.

Aunque digo botón arriba, en realidad es una etiqueta para una entrada de radio, pero también ocurre en los botones.

Después de sumergirme en el problema, descubrí que no son eventos de enfoque, sino los siguientes eventos que se disparan dependiendo de cómo se presione el botón:

Código para imprimir los eventos:

 ['focus', 'contextmenu', 'touchstart', 'touchend', 'touchcancel', 'touchmove', 'click'].forEach( eventName => { document.addEventListener(eventName, event => console.log(eventName)) });

Y estos son los tipos de prensas:

 // Context menu (slightly longer press) touchstart contextmenu touchend // Touch move (not stead finger press)1 touchstart touchmove x N touchend // Touch move and context menu (combination of above) touchstart contextmenu touchmove touchend // Got it right, click occurred touchstart touchend click

Lo intenté:

 document.addEventListener('touchstart', event => { event.preventDefault(); event.target.click();} )

Pero luego, si obtiene el clic correcto, disparará un segundo clic. Deseo convertir todos los escenarios anteriores en un solo clic.

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Podría pasar una versión antirrebote (o acelerada) de su detector de eventos a todas las funciones de la siguiente manera:

 // copied from https://davidwalsh.name/javascript-debounce-function function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }; const myDebouncedFunction = debounce(myHandler, 100, true); document.addEventListener('touchstart', myDebouncedFunction); document.addEventListener('click', myDebouncedFunction); ... whatever other events you want to attach to

Alternativamente, si usa lodash, puede usar su función de rebote incorporada.

about 4 years ago · Juan Pablo Isaza Relatório

0

Gracias a Tom, creé un rebote simplificado, si no hubo ningún clic dentro de los 100 ms después del evento del extremo táctil, luego disparé uno.

 var touchedEl = null; document.addEventListener('click', () => touchedEl = null); document.addEventListener('touchend', event => {touchedEl=event.target; setTimeout(() => { touchedEl && touchedEl.click() }, 100)})
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda